package com.jiyongjun.component.exception.convertor;

import com.jiyongjun.component.core.model.DubboLogContext;
import com.jiyongjun.component.exception.parser.ExceptionParseResult;
import org.apache.dubbo.rpc.Result;

/**
 * <h2></h2>
 * <h3>描述：</h3>
 *
 * @author yongjun.jyj
 * @since 2022/6/16 16:31
 */
public interface DubboConsumerExceptionConvertor {
    /**
     * 处理异常<br/>
     * 例如：
     * <li>处理超时，将超时异常转换为自定义异常</li>
     * <li>将服务提供方的异常转换为自定义异常</li>
     * <p>如果转换为异常，可以通过{@link Result#setValue(Object)} 来设置返回结果</p>
     */
    default void handleException(Result rpcResult, ExceptionParseResult exceptionParseResult) {}

    /**
     * 处理出参：
     * <p>可以判断调用在业务上是否算是成功：
     *  <li>根据响应结果判断是业务错误，则调用`logContext.setBizException(bizException);`</li>
     *  <li>根据响应结果判断如果是服务错误，则调用`logContext.setServiceException(serviceException);`</li>
     * </p>
     *
     * @param rpcResult rpcResult
     * @param logContext logContext
     */
    void handleResponse(Result rpcResult, DubboLogContext logContext);
}
